Skip to content

ref(browser): remove web vital standalone span experiments - #21215

Merged
logaretm merged 5 commits into
developfrom
awad/js-2628-deprecate-web-vitals-experiment-spans
Jul 22, 2026
Merged

ref(browser): remove web vital standalone span experiments#21215
logaretm merged 5 commits into
developfrom
awad/js-2628-deprecate-web-vitals-experiment-spans

Conversation

@logaretm

@logaretm logaretm commented May 28, 2026

Copy link
Copy Markdown
Member

Removes the standalone CLS/LCP web vital experiment options.

This means web vitals will behave as such:

  • INP is sent as v1 standalone span or v2 spans depending on span streaming option
  • CLS/LCP are sent as:
    • if span streaming is disabled: measurements on pageload spans.
    • if span streaming is enabled: dedicated v2 spans.

In other words, it just drops the experimental options, and the user will no longer have control over how CLS/LCP are sent except by opting in to span streaming.

Future work may include dropping v1 standalone spans entirely if we migrate INP off to v2

@linear-code

linear-code Bot commented May 28, 2026

Copy link
Copy Markdown

JS-2628

@github-actions

github-actions Bot commented May 28, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️ Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

Path Size % Change Change
@sentry/browser 27.76 kB - -
@sentry/browser - with treeshaking flags 26.2 kB - -
@sentry/browser (incl. Tracing) 46.28 kB -0.68% -314 B 🔽
@sentry/browser (incl. Tracing + Span Streaming) 48.07 kB -0.68% -328 B 🔽
@sentry/browser (incl. Tracing, Profiling) 51.1 kB -0.57% -289 B 🔽
@sentry/browser (incl. Tracing, Replay) 85.56 kB -0.32% -274 B 🔽
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags 75.2 kB -0.36% -271 B 🔽
@sentry/browser (incl. Tracing, Replay with Canvas) 90.26 kB -0.33% -292 B 🔽
@sentry/browser (incl. Tracing, Replay, Feedback) 102.92 kB -0.29% -291 B 🔽
@sentry/browser (incl. Feedback) 44.95 kB - -
@sentry/browser (incl. sendFeedback) 32.56 kB - -
@sentry/browser (incl. FeedbackAsync) 37.62 kB - -
@sentry/browser (incl. Metrics) 28.84 kB - -
@sentry/browser (incl. Logs) 29.06 kB - -
@sentry/browser (incl. Metrics & Logs) 29.76 kB - -
@sentry/react 29.55 kB - -
@sentry/react (incl. Tracing) 48.59 kB -0.58% -283 B 🔽
@sentry/vue 33.18 kB - -
@sentry/vue (incl. Tracing) 48.24 kB -0.66% -320 B 🔽
@sentry/svelte 27.78 kB - -
CDN Bundle 30.1 kB - -
CDN Bundle (incl. Tracing) 48.15 kB -0.69% -334 B 🔽
CDN Bundle (incl. Logs, Metrics) 31.68 kB - -
CDN Bundle (incl. Tracing, Logs, Metrics) 49.47 kB -0.63% -309 B 🔽
CDN Bundle (incl. Replay, Logs, Metrics) 70.94 kB - -
CDN Bundle (incl. Tracing, Replay) 85.71 kB -0.33% -278 B 🔽
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) 87.02 kB -0.34% -293 B 🔽
CDN Bundle (incl. Tracing, Replay, Feedback) 91.5 kB -0.34% -307 B 🔽
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) 92.78 kB -0.31% -287 B 🔽
CDN Bundle - uncompressed 89.72 kB - -
CDN Bundle (incl. Tracing) - uncompressed 144.82 kB -1.22% -1.78 kB 🔽
CDN Bundle (incl. Logs, Metrics) - uncompressed 94.43 kB - -
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed 148.8 kB -1.19% -1.78 kB 🔽
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed 219.19 kB - -
CDN Bundle (incl. Tracing, Replay) - uncompressed 264.06 kB -0.67% -1.78 kB 🔽
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed 268.02 kB -0.66% -1.78 kB 🔽
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed 277.76 kB -0.64% -1.78 kB 🔽
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed 281.71 kB -0.63% -1.78 kB 🔽
@sentry/nextjs (client) 51.09 kB -0.57% -288 B 🔽
@sentry/sveltekit (client) 46.7 kB -0.65% -301 B 🔽
@sentry/core/server 80.13 kB - -
@sentry/core/browser 51.97 kB - -
@sentry/node 124.21 kB - -
@sentry/node (incl. diagnostics channel injection) 149.66 kB +0.01% +1 B 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection) 70.03 kB - -
@sentry/node - without tracing 74.38 kB +0.01% +1 B 🔺
@sentry/aws-serverless 83.86 kB - -
@sentry/cloudflare (withSentry) - minified 196.59 kB - -
@sentry/cloudflare (withSentry) 483.84 kB - -

View base workflow run

@logaretm
logaretm force-pushed the awad/js-2628-split-web-vitals-into-their-own-integration branch from 98a76d7 to 00cd99b Compare June 1, 2026 15:12
Base automatically changed from awad/js-2628-split-web-vitals-into-their-own-integration to develop June 3, 2026 19:49
@logaretm logaretm closed this Jun 4, 2026
@logaretm
logaretm force-pushed the awad/js-2628-deprecate-web-vitals-experiment-spans branch from 12da820 to 983fbac Compare June 4, 2026 14:17
@logaretm logaretm reopened this Jun 4, 2026
@logaretm
logaretm marked this pull request as ready for review June 4, 2026 20:14
@logaretm
logaretm requested a review from a team as a code owner June 4, 2026 20:14
@logaretm
logaretm requested review from Lms24 and mydea and removed request for a team June 4, 2026 20:14
Comment thread packages/browser/src/integrations/webVitals.ts Outdated
@logaretm
logaretm marked this pull request as draft June 8, 2026 16:35
@logaretm

logaretm commented Jun 8, 2026

Copy link
Copy Markdown
Member Author

Drafting this till we think about the implications of dropping v2 span path as well.

@logaretm
logaretm force-pushed the awad/js-2628-deprecate-web-vitals-experiment-spans branch from dad441e to 4dda73e Compare June 10, 2026 15:07
logaretm and others added 2 commits July 21, 2026 15:04
CLS and LCP are now always recorded as measurements (on transaction
pageload spans) or attributes (on streamed pageload spans), never as
their own separate spans.

Removes `_experiments.enableStandaloneClsSpans` and
`_experiments.enableStandaloneLcpSpans` options from both
`webVitalsIntegration` and `browserTracingIntegration`.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When span streaming (v2) is enabled, LCP and CLS are now always emitted as
standalone v2 spans (like INP) instead of being recorded as measurements or
attributes on the pageload span. When span streaming is disabled, they
continue to be recorded as measurements on the pageload span.

This behavior is no longer user-configurable; the previously removed
`_experiments.enableStandaloneClsSpans` / `enableStandaloneLcpSpans` options
stay removed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@logaretm
logaretm force-pushed the awad/js-2628-deprecate-web-vitals-experiment-spans branch from 4dda73e to 0684e6b Compare July 21, 2026 19:07
@logaretm
logaretm marked this pull request as ready for review July 21, 2026 20:49

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 07d67f2. Configure here.

Comment thread packages/browser-utils/src/metrics/browserMetrics.ts
Comment thread packages/browser-utils/src/metrics/cls.ts Outdated
Comment thread packages/browser-utils/src/metrics/cls.ts Outdated
Comment thread packages/browser-utils/test/metrics/webVitalSpans.test.ts

@Lms24 Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

last request: Can we drop a note in MIGRATION.md that these experimental options were removed and LCP/CLS are now always sent as spans by default, and as previously on the transaction if users opt out of span streaming.

@github-actions

Copy link
Copy Markdown
Contributor

👋 @mydea — Please review this PR when you get a chance!

- Delete dead cls.ts stub (now that standalone CLS tracking is removed)
- Keep asserting sentry.segment.name on streamed CLS/LCP spans (unit + integration)
- Document removal of the experimental standalone options in MIGRATION.md
@logaretm
logaretm requested a review from Lms24 July 22, 2026 12:53
@logaretm
logaretm requested review from msonnb and removed request for mydea July 22, 2026 12:54
Comment on lines 448 to 450
setAttr('ttfb.requestTime', _measurements['ttfb.requestTime'].value, 'browser.web_vital.ttfb.request_time');
}
} else {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: The client parameter in StartTrackingWebVitalsOptions is passed to startTrackingWebVitals but is unused within the function.
Severity: LOW

Suggested Fix

Remove the client property from the StartTrackingWebVitalsOptions interface in browserMetrics.ts and stop passing it to startTrackingWebVitals from the call site in webVitals.ts to clean up the API surface.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.

Location: packages/browser-utils/src/metrics/browserMetrics.ts#L448-L450

Potential issue: The `startTrackingWebVitals` function in
`packages/browser-utils/src/metrics/browserMetrics.ts` is defined to accept a `client`
parameter via its `StartTrackingWebVitalsOptions` interface. However, the function's
implementation only destructures and uses the `trackCls` and `trackLcp` properties. The
`client` parameter is passed at the call site in
`packages/browser/src/integrations/webVitals.ts` but is never used within the function
body. This is a remnant from a refactoring and does not cause any runtime errors or
incorrect behavior, but it makes the function's API misleading.

Also affects:

  • packages/browser/src/integrations/webVitals.ts:60~67

Did we get this right? 👍 / 👎 to inform future reviews.

The branch's streamed CLS/LCP test snapshot predated #22024 and #22060,
so it had reverted the sentry.segment.name assertion and reintroduced the
attributes?. definedness checks. Drop the ?. again and keep only the
intentional change: removing the deprecated sentry.transaction assertion.
@Lms24

Lms24 commented Jul 22, 2026

Copy link
Copy Markdown
Member

nice to see some bytes being removed for a change :D

@logaretm
logaretm merged commit b94a679 into develop Jul 22, 2026
285 checks passed
@logaretm
logaretm deleted the awad/js-2628-deprecate-web-vitals-experiment-spans branch July 22, 2026 16:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants